From d7d7c642c2bd5bdb936303d686e701e10b434f75 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 17 Jan 2006 13:25:30 +0100 Subject: [PATCH] Sync against scheduler tail on other CPUs when context switching to a new VCPU. Otherwise we cannot pull the VCPU's state off the other CPU. Signed-off-by: Keir Fraser --- xen/arch/x86/domain.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index b38147211a..25746ab4f1 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -738,8 +738,12 @@ void context_switch(struct vcpu *prev, struct vcpu *next) ASSERT(cpus_weight(dirty_mask) <= 1); if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) ) { + /* Make sure the next VCPU is not in a scheduling tail. */ + while ( test_bit(_VCPUF_running, &next->vcpu_flags) ) + cpu_relax(); /* Other cpus call __sync_lazy_execstate from flush ipi handler. */ - flush_tlb_mask(dirty_mask); + if ( !cpus_empty(next->vcpu_dirty_cpumask) ) + flush_tlb_mask(next->vcpu_dirty_cpumask); } local_irq_disable(); -- 2.30.2